package com.zw.common.utils;
import lombok.NonNull;

import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class BeanUtils {

    /**
     * 实体转换
     *
     * @param src         源对象
     * @param supplier    目标对象提供者
     * @param postHandler 后处理
     * @param <S>         源对象类型
     * @param <T>         目标对象类型
     * @return 目标对象
     */
    public static <S, T> T copyProperties(@NonNull S src, @NonNull Supplier<T> supplier, BiConsumer<S, T> postHandler) {
        T target = supplier.get();
        org.springframework.beans.BeanUtils.copyProperties(src, target);
        postHandler.accept(src, target);
        return target;
    }

    public static <S, T> T copyProperties(@NonNull S src, @NonNull Supplier<T> supplier) {
        T target = supplier.get();
        org.springframework.beans.BeanUtils.copyProperties(src, target);
        return target;
    }

    /**
     * 实体列表转换
     *
     * @param list        源列表
     * @param supplier    目标对象提供者
     * @param postHandler 后处理
     * @param <S>         源对象类型
     * @param <T>         目标对象类型
     * @return 目标对象列表
     */
    public static <S, T> List<T> copyListProperties(@NonNull List<S> list, @NonNull Supplier<T> supplier, BiConsumer<S, T> postHandler) {
        return list.stream()
                .map(it -> copyProperties(it, supplier, postHandler))
                .collect(Collectors.toList());
    }

    public static <S, T> List<T> copyListProperties(@NonNull List<S> list, @NonNull Supplier<T> supplier) {
        return list.stream()
                .map(it -> copyProperties(it, supplier))
                .collect(Collectors.toList());
    }

}
